home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy004 / files / articulo.001 < prev    next >
Encoding:
Text File  |  1997-06-14  |  12.0 KB  |  301 lines

  1. *cX          Curso de assembler (IV)
  2.  
  3. *cR  Vamos a continuar en esta nueva entrega con 
  4. algo más fuertecillo... después de  presentar
  5. el A86 (incluido en este número), daremos  un
  6. profundo repaso a  las  principales interrup-
  7. ciones para luego poder iniciar proyectos más 
  8. complejos.  Pero  empezemos  corrigiendo  los
  9. programitas que puse el pasado dia:
  10.  
  11. *c7 MOV     AX, 100 *c1 ; AX=100
  12. *c7 MOV     BX, 200 *c1 ; BX=200
  13. *c7 ADD     AX, BX  *c1 ; AX=300
  14. *c7 MUL     BX      *c1 ; DX:AX=200*300=60000
  15. *cR
  16.   Este era un ejemplo  muy  sencillo  que  no
  17. tenia ningún tipo de  error  ni  complicación
  18. más allá de lo normal. El próximo os ha  dado
  19. problemas  a  alguno  pues  lo   intentasteis
  20. compilar y no os dejó:
  21.  
  22. *c7 MOV     AX, 30 *c1  ; AX=30
  23. *c7 MOV     BX, 10 *c1  ; BX=10
  24. *c7 MUL     BX     *c1  ; DX:AX=30*10=300
  25. *c7 DIV     BX     *c1  ; DX=0 AX=30
  26. *c7 ADD     AL, BX *c1  ; ERROR!!!
  27. *cR
  28.   La última instrucción da un error de compi-
  29. lación ya que no se puede sumar un número  de
  30. 8 bits con otro  de  16.  El  último  de  los
  31. problemitas tampoco  se  podia  compilar  por
  32. varios errores:
  33.  
  34. *c7 MOV     AL, 500 *c1 ; ERROR!!!
  35. *c7 MOV     BL, 100 *c1 ; BL=100
  36. *c7 SUB     AL, BL  *c1 ; AL=AL-100
  37. *c7 MUL     10      *c1 ; ERROR!!!
  38. *cR
  39.   En la primera línea ya nos  encontramos  un
  40. error bastante gordo, pero muy  frequente  al
  41. principio que consiste en tratar de meter  en
  42. un registro de 8 bits (en este caso) un valor 
  43. de más bits (al menos  9  para  el  500).  La
  44. solución seria usar AX que puede  representar
  45. hasta 16 bits. El otro error que  aparece  es
  46. la multiplicación que se intenta hacer en  la
  47. última línea y que es ilegal ya que  no pode-
  48. mos multiplicar por un valor constante.
  49.  
  50. *cV      El ensamblador A86
  51. *cR
  52.   El A86 es un ensamblador shareware que  nos
  53. permitirá crear  código  para  el  procesador
  54. 8086 que es el que estamos "estudiando" aquí. 
  55. No se trata de un  ensamblador  completísimo,
  56. con miles de opciones para hacer  virguerias,
  57. es un programita de lo más simple en el mundo 
  58. de los ensambladores, pero  esa  simplicidad,
  59. lejos de hacerlo inferior, provoca que se use 
  60. siempre que  se  desee  hacer  un  programita
  61. rápido.
  62.   Lo  usaremos  durante  unos  meses  ya  que
  63. durante  la  fase  de  aprendizaje  es  mejor
  64. dejarse de complicaciones, por lo  que  seria
  65. recomendable que si dominas el inglés te leas 
  66. los manuales que, por cierto, llevan un curso 
  67. básico  de  assembler.  Tambien  deberias  de
  68. registrarte si te gusta  y  lo  vas  a  usar,
  69. aunque yo no creo que lo hagas... como todos. 
  70. :)
  71.   Vamos  con  la  sintáxis.  ¿Recordais   los
  72. programitas de antes? Pues podeis
  73. probar a teclearlos y ensamblarlos... no hace
  74. falta que le digais nada más, el assembler lo 
  75. ha  sobre-entendido  todo.  Como  ejemplo  he
  76. metido un archivo llamado  '*cCaritmet1.asm*cR'  en
  77. el directorio '*cAASM*cR'  que  podeis  compilar  y
  78. luego debuggear con  el  própio  'debug'  del
  79. DOS.  
  80.   Como podreis observar, el A86 es tan simple 
  81. que consta de un sólo ejecutable  que  podeis
  82. incluso (por su reducido  tamaño)  copiar  al
  83. directorio del *cADOS*cR o si no lo preferiis poner 
  84. en la variable *cAPATH*cR del sistema la ruta hasta 
  85. donde se encuentra dicho fichero. Además  del
  86. A86, existe un debugger llamado D86 y  creado
  87. por   la   misma   persona   que   lee    los
  88. ficheros *cA.SYM*cR generados y nos ayuda a debuggear 
  89. (tal vez en próximos números  se  incluya  el
  90. *cAD86*cR).
  91.   Los comentarios en el *cAA86*cR,  como  en  todos
  92. los ensambladores, consisten en  un  punto  y
  93. coma y de ahí a final de línea  es  ignorado.
  94. Hay unas cuantas directivas para el ensambla-
  95. dor que no veremos si no nos son necesarias y 
  96. de las que  podreis  ver  una  referencia  en
  97. los *cA.DOC*cR que se adjuntan. Otra cosita bastan-
  98. te simple del *cA A86  *cRson  las  etiquetas,  una
  99. etiqueta es cualquier secuencia de caracteres 
  100. válida acabada en ':' (dos puntos).  Un ejem-
  101. plo de uso de  etiquetas  lo  podeis  ver  en
  102. *cCaritmet2.asm*cR  que  es  un  ejemplo  algo  más
  103. complejo que estudiaremos ahora enseguida.
  104.  
  105. *cV          Instrucciones de bifurcación
  106. *cR
  107.   Tras ese pomposo nombre se esconden ni  más
  108. ni menos  que  los  saltos  que  se  producen
  109. durante  la  ejecución  del  programa.   Está
  110. clarísimo que no se puede programar de  forma
  111. lineal y por tanto el procesador  ha  de pro-
  112. porcionarnos una forma de hacer  que  el pro-
  113. grama siga su curso por otro  camino  que  no
  114. sea la  línea  recta.  Las  causas  de  salto
  115. pueden ser:  interrupciones  (tanto  software
  116. como hardware), llamadas a subrutinas, saltos 
  117. condicionales y saltos incondicionales. Vamos 
  118. a ver, por orden inverso, los saltitos:
  119.   Los  saltos  incondicionales  son  los  que
  120. produce el programador para cambiar la ejecu-
  121. ción del programa a otro punto por  la  razón
  122. que sea. La instrucción  que  se  encarga  de
  123. hacerlo es JMP que es  el  acrónimo  de  JUMP
  124. (salto). Vamos con el ejemplo:
  125.  
  126. *c7      MOV  AX, 100   *c1  [1]
  127. *c7      MOV  BX, 200   *c1  [2]
  128. *c7      JMP  Suma      *c1  [3]
  129. *c7 Fin:                *c1  [4]    *i%
  130. *c7      MOV  AX,4C00h  *c1  [5]
  131. *c7      INT  21h       *c1  [6]
  132. *c7 Suma:               *c1  [7]
  133. *c7      ADD  AX, BX    *c1  [8]
  134. *c7      JMP  Fin       *c1  [9]
  135. *cR
  136.   Este sencillísimo código  lo  que  hace  es
  137. primero guardar 2 valores inmediatos en AX  y
  138. BX (lineas 1 y 2), luego saltar  con  la ins-
  139. trucción  JMP  a  la  etiqueta  *cCSuma*cR  que  se
  140. encuentra en la línea 7, se suman los números 
  141. y se salta a la línea 4 donde se ejecutan las 
  142. 2 líneas que terminan  la  ejecución  de  los
  143. programas.
  144.   Como podrás ver, la instrucción JMP  es  el
  145. GOTO de Basic, C, Pascal y  tantos  lenguajes
  146. de alto nivel  que  siempre  nos  prohibieron
  147. usar (pero que aquí es lo único que se  puede
  148. emplear para determinadas cosas).
  149.   Los saltos condicionales son un  tipo espe-
  150. cial de salto que se ejecutan según el estado 
  151. que la anterior instrucción haya dejado en el 
  152. registro de flags o banderas. Antes de  nada,
  153. el registro de estado (de flags o como te  de
  154. la gana), es  un  registro  que  no  se  debe
  155. modificar y  que  guarda  información  de  la
  156. ejecución de la última instrucción, bueno, no 
  157. exactamente la última,  la  última  que  haya
  158. modificado el registro de estado,  es  decir,
  159. algunas lo modifican y otras no  (en  general
  160. lo modifican las que pasan pasan por la  ALU,
  161. las aritméticas). Este registro guarda infor-
  162. mación sobre como si, por  ejemplo,  los  dos
  163. registros implicados en una  resta  han  dado
  164. resultado  cero,  o  negativo,  etc.   Bueno,
  165. veamos un ejemplo y luego sigo:
  166.  
  167. *c7      MOV  AX, 40    *c1 [ 1]
  168. *c7      MOV  BX, 20    *c1 [ 2]
  169. *c7      SUB  AX, BX    *c1 [ 3]
  170. *c7      JZ   Fin       *c1 [ 4]
  171. *c7      SUB  AX, BX    *c1 [ 5]
  172. *c7      JZ   Fin2      *c1 [ 6]    *i&
  173. *c7 Fin:                *c1 [ 7]
  174. *c7      MOV  AX, 4C00h *c1 [ 8]
  175. *c7      INT  21h       *c1 [ 9]
  176. *c7 Fin2:               *c1 [10]
  177. *c7      JMP  Fin       *c1 [11]
  178. *cR
  179.   En el ejemplo lo primero  que  se  hace  es
  180. poner en AX y BX los valores iniciales, luego 
  181. se hace la resta AX-BX que da como  resultado
  182. AX=40-20=20 y en el  registro  de  estado  se
  183. pone  el  bit  correspondiente  como  que  el
  184. resultado NO es cero. En la línea  4  aparece
  185. la primera línea  de  salto  condicional  que
  186. viene a decir aproximadamente "si el  resulta
  187. do de la  operación *cASUB AX,BX*cR  era 0, entoces 
  188. saltar a *cBFin*cR, en  otro  caso,  continuar  por
  189. la siguiente línea (5)". Como el resultado
  190. no habia dado 0, no se salta  y  se  continua
  191. con la ejecución de la línea 5  que  es  otra
  192. resta, pero que en esta ocasión,  sí  resulta
  193. ser cero. La línea 6 es análoga a la 4,  pero
  194. resulta que la anterior instrucción sí  habia
  195. dado como resultado 0 y por tanto  habrá  que
  196. saltar  a  la  etiqueta  *cBFin2*cR.  La   etiqueta
  197. *cBFin2*cR nos  lleva  a  la  instrucción  *cBJMP  Fin*cR
  198. que salta incondicionalmente  a  la  línea  7
  199. donde se termina el programa con las  típicas
  200. intrucciones.
  201.   Muchas veces, nos interesará  saltar  si  2
  202. registros  son  iguales,  pero  no  querremos
  203. perder el contenido de  uno  de  ellos,  para
  204. esto hay una instrucción que es CMP
  205. y que es el acrónimo de *cACOMPARE*cR.  Básicamente
  206. lo que hace es restar los 2 registros que  se
  207. indiquen, pero sin escribir el  resultado  en
  208. el destino. Como  te  podrás  imaginar,  para
  209. saber si los 2 registros son iguales, hay que 
  210. mirar si despues de restarlos el resultado es 
  211. 0 (con el bit de cero del registro de flags). 
  212. La lista completa de instrucciones  de  salto
  213. condicional ya  las  veremos,  pero  las  más
  214. importantes son (aunque algunas como JZ y  JE
  215. sean iguales):
  216.  
  217. *c2      JZ *c3 -> *c4 si cero
  218. *c2      JE *c3 -> *c4 si iguales
  219. *c2      JC *c3 -> *c4 si lleva acarreo
  220. *c2      JB *c3 -> *c4 si menor que
  221. *c2      JA *c3 -> *c4 si mayor que
  222. *c2      JS *c3 -> *c4 si es negativo
  223. *cR
  224. *c6 NOTA: *cRSe puede intercalar la letra 'N'  para
  225. indicar negación, por ejemplo,  *cTJE*cR  salta  si
  226. son iguales y *cTJNE*cR salta si no son iguales. 
  227.   Las llamadas a  subrutinas  son  el  tercer
  228. tipo de salto que veremos. Se usa la instruc-
  229. ción *cTCALL *cR(llamar) seguida por una etiqueta y 
  230. es equivalente a la instrucción de  BASIC  (o
  231. otros lenguajes lineales) GOSUB.  Lo  que  se
  232. hace internamente es muy importante e intere-
  233. sante, pero no lo veremos hasta  que  sepamos
  234. que es la pila. En este número  sólo  veremos
  235. un ejemplo y  dejaré  para  más  adelante  el
  236. estudio concienzudo de los subprogramas:
  237.  
  238. *c7  MOV  AX, 100  *c1  ;  Inicializamos AX y BX
  239. *c7  MOV  BX, 80   *c1  ; a un valor cualquiera.
  240. *c7  CALL Suma     *c1  ;  Llamamos a Suma.
  241. *c7  MOV  AX, 4C00h*c1  ;  En DX ahora tendremos la
  242. *c7  INT  21h      *c1  ; suma de AX y BX.
  243. *c7 Suma:
  244. *c7  MOV  DX, AX   *c1  ;  Subprograma para sumar 2
  245. *c7  ADD  DX, BX   *c1  ; números.
  246. *c7  RET   *c1  ;  Instrucción para regresar
  247. *cR
  248.   El último tipo  de  bifurcaciones  son  las
  249. interrupciones.  Básicamente  se   trata   de
  250. subprogramas predefinidos a los que se  llama
  251. para realizar una tarea en concreto  (mostrar
  252. un mensaje, salir al DOS, etc). No  me exten-
  253. deré más en esto ya que en el  pasado  número
  254. ya tuvisteis el primer contacto y más adelan-
  255. te tendreis otro contacto.
  256.   Con estos saltos que habeis podido ver,  el
  257. programador ya puede  empezar  a  estructurar
  258. sus programas tal como lo hacia con los HLL y 
  259. compactar aún más sus programas. Recomendaria 
  260. que los programitas de ejemplo que he mostra-
  261. do, los compilarais y los ejecutarais paso  a
  262. paso para ver por donde va el  curso  de ins-
  263. trucciones en cada momento.
  264.  
  265. *cV          Las principales interrupciones
  266. *cR
  267.   Como hay muchas interrupciones  para  hacer
  268. muy variadas cosas, lo mejor es (bla, bla...)
  269. que consigais la lista de Ralf Brown  o  algo
  270. similar y busqueis la  interrupción  adecuada
  271. para lo que vayais a hacer. Por  ejemplo,  si
  272. necesitais abrir ficheros ymanejar  su conte-
  273. nido, le deciis al programa que busque  "open
  274. file" o algo por el estilo y encontrareis  un
  275. servicio (*cA3Dh*cR) dentro de la *cBINT  21h*cR  que  os
  276. permitirá abrir ficheros. A partir  de  este,
  277. mirais los servicios asociados y encontrareis 
  278. como cerrar el fichero  (*cA3Eh*cR),  como posicio-
  279. narte (*cA42h*cR), etc.
  280.   Iba a hacer una lista de los mejores,  pero
  281. como seguro que todos teneis o  podeis conse-
  282. guir la lista esta de  R.B.  pues  no  lo  he
  283. hecho. De todas formas  si  teneis  problemas
  284. encontrandola o no  os  aclarais  con  alguna
  285. interrupción, no dudeis  en  preguntar.  Para
  286. que tengais unos ejemplos más, os he incluido 
  287. un sencillo código que lo que hace  es  decir
  288. si existe o no un fichero. Prueba a  crear  y
  289. eliminar el fichero y  debuggea  el  programa
  290. para ver que hace en cada instante.
  291.  
  292.   Como el tiempo apremia  por  culpa  de  los
  293. malditos exámenes, no  he  podido  hacer  más
  294. ejemplos ni explicar las  instrucciones lógi-
  295. cas, pero en el  próximo  número  seguro  que
  296. tendreis mucha  más  chicha  que  en  este...
  297. practicad mucho y no seais malos (=no progra-
  298. meis en Visual Basic :)
  299.  
  300.             *cM                    Navi Dj.
  301.